From: Keir Fraser Date: Fri, 27 Jun 2008 13:38:41 +0000 (+0100) Subject: shadow: Re-initialise page_info's lock field when freeing shadow pages. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14192^2~26 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=2be6d58ce6d51fbc5b095c889705cedc3ce0aca1;p=xen.git shadow: Re-initialise page_info's lock field when freeing shadow pages. Fixes boot failure of xenU after destroying a HVM guest. Signed-off-by: Dongxiao Xu Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 34cddea6d7..9200930e79 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -1830,6 +1830,14 @@ static unsigned int sh_set_allocation(struct domain *d, sp = list_entry(d->arch.paging.shadow.freelists[order].next, struct shadow_page_info, list); list_del(&sp->list); +#if defined(__x86_64__) + /* + * Re-instate lock field which we overwrite with shadow_page_info. + * This was safe, since the lock is only used on guest pages. + */ + for ( j = 0; j < 1U << order; j++ ) + spin_lock_init(&((struct page_info *)sp)[j].lock); +#endif d->arch.paging.shadow.free_pages -= 1 << order; d->arch.paging.shadow.total_pages -= 1 << order; free_domheap_pages((struct page_info *)sp, order);